<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="generator" content="AsciiDoc 8.2.2" />
<style type="text/css">
/* Debug borders */
p, li, dt, dd, div, pre, h1, h2, h3, h4, h5, h6 {
/*
  border: 1px solid red;
*/
}

body {
  margin: 1em 5% 1em 5%;
}

a {
  color: blue;
  text-decoration: underline;
}
a:visited {
  color: fuchsia;
}

em {
  font-style: italic;
}

strong {
  font-weight: bold;
}

tt {
  color: navy;
}

h1, h2, h3, h4, h5, h6 {
  color: #527bbd;
  font-family: sans-serif;
  margin-top: 1.2em;
  margin-bottom: 0.5em;
  line-height: 1.3;
}

h1 {
  border-bottom: 2px solid silver;
}
h2 {
  border-bottom: 2px solid silver;
  padding-top: 0.5em;
}

div.sectionbody {
  font-family: serif;
  margin-left: 0;
}

hr {
  border: 1px solid silver;
}

p {
  margin-top: 0.5em;
  margin-bottom: 0.5em;
}

pre {
  padding: 0;
  margin: 0;
}

span#author {
  color: #527bbd;
  font-family: sans-serif;
  font-weight: bold;
  font-size: 1.1em;
}
span#email {
}
span#revision {
  font-family: sans-serif;
}

div#footer {
  font-family: sans-serif;
  font-size: small;
  border-top: 2px solid silver;
  padding-top: 0.5em;
  margin-top: 4.0em;
}
div#footer-text {
  float: left;
  padding-bottom: 0.5em;
}
div#footer-badges {
  float: right;
  padding-bottom: 0.5em;
}

div#preamble,
div.tableblock, div.imageblock, div.exampleblock, div.verseblock,
div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
div.admonitionblock {
  margin-right: 10%;
  margin-top: 1.5em;
  margin-bottom: 1.5em;
}
div.admonitionblock {
  margin-top: 2.5em;
  margin-bottom: 2.5em;
}

div.content { /* Block element content. */
  padding: 0;
}

/* Block element titles. */
div.title, caption.title {
  font-family: sans-serif;
  font-weight: bold;
  text-align: left;
  margin-top: 1.0em;
  margin-bottom: 0.5em;
}
div.title + * {
  margin-top: 0;
}

td div.title:first-child {
  margin-top: 0.0em;
}
div.content div.title:first-child {
  margin-top: 0.0em;
}
div.content + div.title {
  margin-top: 0.0em;
}

div.sidebarblock > div.content {
  background: #ffffee;
  border: 1px solid silver;
  padding: 0.5em;
}

div.listingblock {
  margin-right: 0%;
}
div.listingblock > div.content {
  border: 1px solid silver;
  background: #f4f4f4;
  padding: 0.5em;
}

div.quoteblock > div.content {
  padding-left: 2.0em;
}

div.attribution {
  text-align: right;
}
div.verseblock + div.attribution {
  text-align: left;
}

div.admonitionblock .icon {
  vertical-align: top;
  font-size: 1.1em;
  font-weight: bold;
  text-decoration: underline;
  color: #527bbd;
  padding-right: 0.5em;
}
div.admonitionblock td.content {
  padding-left: 0.5em;
  border-left: 2px solid silver;
}

div.exampleblock > div.content {
  border-left: 2px solid silver;
  padding: 0.5em;
}

div.verseblock div.content {
  white-space: pre;
}

div.imageblock div.content { padding-left: 0; }
div.imageblock img { border: 1px solid silver; }
span.image img { border-style: none; }

dl {
  margin-top: 0.8em;
  margin-bottom: 0.8em;
}
dt {
  margin-top: 0.5em;
  margin-bottom: 0;
  font-style: italic;
}
dd > *:first-child {
  margin-top: 0;
}

ul, ol {
    list-style-position: outside;
}
ol.olist2 {
  list-style-type: lower-alpha;
}

div.tableblock > table {
  border: 3px solid #527bbd;
}
thead {
  font-family: sans-serif;
  font-weight: bold;
}
tfoot {
  font-weight: bold;
}

div.hlist {
  margin-top: 0.8em;
  margin-bottom: 0.8em;
}
div.hlist td {
  padding-bottom: 5px;
}
td.hlist1 {
  vertical-align: top;
  font-style: italic;
  padding-right: 0.8em;
}
td.hlist2 {
  vertical-align: top;
}

@media print {
  div#footer-badges { display: none; }
}

div#toctitle {
  color: #527bbd;
  font-family: sans-serif;
  font-size: 1.1em;
  font-weight: bold;
  margin-top: 1.0em;
  margin-bottom: 0.1em;
}

div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
  margin-top: 0;
  margin-bottom: 0;
}
div.toclevel2 {
  margin-left: 2em;
  font-size: 0.9em;
}
div.toclevel3 {
  margin-left: 4em;
  font-size: 0.9em;
}
div.toclevel4 {
  margin-left: 6em;
  font-size: 0.9em;
}
/* Workarounds for IE6's broken and incomplete CSS2. */

div.sidebar-content {
  background: #ffffee;
  border: 1px solid silver;
  padding: 0.5em;
}
div.sidebar-title, div.image-title {
  font-family: sans-serif;
  font-weight: bold;
  margin-top: 0.0em;
  margin-bottom: 0.5em;
}

div.listingblock div.content {
  border: 1px solid silver;
  background: #f4f4f4;
  padding: 0.5em;
}

div.quoteblock-content {
  padding-left: 2.0em;
}

div.exampleblock-content {
  border-left: 2px solid silver;
  padding-left: 0.5em;
}

/* IE6 sets dynamically generated links as visited. */
div#toc a:visited { color: blue; }
</style>
<script type="text/javascript">
/*<![CDATA[*/
window.onload = function(){generateToc(2)}
/* Author: Mihai Bazon, September 2002
 * http://students.infoiasi.ro/~mishoo
 *
 * Table Of Content generator
 * Version: 0.4.sp
 *
 * Feel free to use this script under the terms of the GNU General Public
 * License, as long as you do not remove or alter this notice.
 */

 /* modified by Troy D. Hanson, September 2006. License: GPL */
 /* modified by Stuart Rackham, October 2006. License: GPL */
 /* modified by Shawn Pearce, August 2009. License: GPL */

function getText(el) {
  var text = "";
  for (var i = el.firstChild; i != null; i = i.nextSibling) {
    if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
      text += i.data;
    else if (i.firstChild != null)
      text += getText(i);
  }
  return text;
}

function TocEntry(el, text, toclevel) {
  this.element = el;
  this.text = text;
  this.toclevel = toclevel;
  this.assigned = false;

  if (el.id != '') {
    this.id = el.id;

  } else {
    var a = el.firstChild;
    if ((a.tagName == "a" || a.tagName == "A") && a.id != "") {
      this.id = a.id;
    } else {
      this.id = '';
    }
  }
}

function tocEntries(el, toclevels) {
  var result = new Array;
  var re = new RegExp('[hH]([2-'+(toclevels+1)+'])');
  // Function that scans the DOM tree for header elements (the DOM2
  // nodeIterator API would be a better technique but not supported by all
  // browsers).
  var iterate = function (el) {
    for (var i = el.firstChild; i != null; i = i.nextSibling) {
      if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
        var mo = re.exec(i.tagName)
        if (mo)
          result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
        iterate(i);
      }
    }
  }
  iterate(el);
  return result;
}

// This function does the work. toclevels = 1..4.
function generateToc(toclevels) {
  var simple_re = new RegExp('^[a-zA-Z._ -]{1,}$');
  var entries = tocEntries(document.getElementsByTagName("body")[0], toclevels);
  var usedIds = new Array();

  for (var i = 0; i < entries.length; ++i) {
    var entry = entries[i];
    if (entry.id != "")
      usedIds[entry.id] = entry;
  }

  for (var i = 0; i < entries.length; ++i) {
    var entry = entries[i];
    if (entry.id != "" || !simple_re.exec(entry.text))
      continue;

    var n = entry.text.replace(/ /g, '_').toLowerCase();
    var e = usedIds[n];
    if (e) {
      if (e.assigned)
        e.id = '';
      continue;
    }

    entry.assigned = true;
    entry.id = n;
    entry.element.id = entry.id;
    usedIds[n] = entry;
  }

  for (var i = 0; i < entries.length; ++i) {
    var entry = entries[i];
    if (entry.id == '') {
      entry.id = "toc" + i;
      entry.element.id = entry.id;
    }
  }

  var toc = document.getElementById("toc");
  for (var i = 0; i < entries.length; ++i) {
    var entry = entries[i];
    var a = document.createElement("a");
    a.href = "#" + entry.id;
    a.appendChild(document.createTextNode(entry.text));
    var div = document.createElement("div");
    div.appendChild(a);
    div.className = "toclevel" + entry.toclevel;
    toc.appendChild(div);
  }
}
/*]]>*/
</script>
<title>Gerrit2 - Eclipse Setup</title>
</head>
<body>
<div id="header">
<h1>Gerrit2 - Eclipse Setup</h1>
<span id="revision">version v2.0.24</span>
<div id="toc">
  <div id="toctitle">Table of Contents</div>
  <noscript><p><b>JavaScript must be enabled in your browser to display the table of contents.</b></p></noscript>
</div>
</div>
<div id="preamble">
<div class="sectionbody">
<p>This document is about installing Gerrit into an Eclipse workspace
for development and debugging, especially with the GWT hosted
mode debugger.</p>
<p>You will need to have the GWT (Google Web Toolkit) 1.7 SDK installed
on your system.  A Java 6 or later SDK is also required to run
GWT's compiler and runtime.</p>
<p>GWT requires the Sun JDK (or OpenJDK).  The GWT "hosted mode"
environment (Eclipse debugger or "make web-shell") does not work
under libgcj.</p>
</div>
</div>
<h2>User Library</h2>
<div class="sectionbody">
<p>Create a user library called <tt>GWT_17</tt>:</p>
<ul>
<li>
<p>
Window &gt; Preferences
</p>
</li>
<li>
<p>
Java &gt; Build Path &gt; User Libraries
</p>
</li>
<li>
<p>
New
</p>
</li>
<li>
<p>
Name: <tt>GWT_17</tt>
</p>
</li>
<li>
<p>
Add JARs&#8230;
</p>
</li>
<li>
<p>
Select <tt>gwt-user.jar</tt> from the $(GWT_SDK) directory.
</p>
</li>
<li>
<p>
Select <tt>gwt-dev-$(OS).jar</tt> from the $(GWT_SDK) directory.
</p>
</li>
</ul>
</div>
<h2>Maven Plugin</h2>
<div class="sectionbody">
<p>Install the Maven Integration plugins:</p>
<p><a href="http://m2eclipse.codehaus.org/">m2eclipse</a></p>
</div>
<h2>Code Formatter Settings</h2>
<div class="sectionbody">
<p>Import GoogleFormat.xml using Window -&gt; Preferences -&gt; Java -&gt;
Code Style -&gt; Formatter -&gt; Import&#8230;</p>
<p>This will define the <em>Google Format</em> profile, which the project
settings prefer when formatting source code.</p>
</div>
<h2>Import Projects</h2>
<div class="sectionbody">
<p>Import pom.xml using General -&gt; Maven Projects</p>
<p>If you also want source projects for gwtorm, gwtjsonrpc or sshd,
import their top-level directories the same way.  Note that you
may need to edit the pom.xml under gerrit to ensure your snapshot
builds are used.</p>
<div class="admonitionblock">
<table><tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">Some of the source code is generated with ANTLR sources.  To
build these files, you need to right click on the imported project,
Maven -&gt; Update Project Configuration.  This should fix the compile
errors identified after import.</td>
</tr></table>
</div>
<p>If you also want a source project for JGit, import the top level
jgit directory using General -&gt; Existing Projects, selecting only
the <tt>org.spearce.jgit</tt> and <tt>org.spearce.jgit.test</tt> projects.</p>
</div>
<h2>Configure Database</h2>
<div class="sectionbody">
<p>You may have already done this step earlier, based on the
instructions in <a href="dev-readme.html">Developer Setup</a>.</p>
<ul>
<li>
<p>
Open gerrit/src/main/java
</p>
</li>
<li>
<p>
Copy <tt>GerritServer.properties_example</tt> to <tt>GerritServer.properties</tt>
</p>
</li>
<li>
<p>
Configure your database for debugging in hosted mode.
</p>
</li>
</ul>
</div>
<h2>Bootstrap Compile</h2>
<div class="sectionbody">
<p>From the command line we have to bootstrap the environment:</p>
<div class="listingblock">
<div class="content">
<pre><tt>  ./to_hosted.sh</tt></pre>
</div></div>
</div>
<h2>Production Compile</h2>
<div class="sectionbody">
<p><strong>Always</strong> use</p>
<div class="listingblock">
<div class="content">
<pre><tt>  mvn clean package</tt></pre>
</div></div>
<p>to create a production build.  The <tt>./to_hosted.sh</tt> used above
to setup the development environment for Eclipse hosted mode also
creates a state that produces a corrupt production build.</p>
</div>
<h2>Launch Gerrit</h2>
<div class="sectionbody">
<p>Open Run-&gt;Debug Configurations&#8230;</p>
<p>Under Java Application find <tt>gerrit_debug</tt> (not Mac OS X)
or <tt>gerrit_macos</tt> (Mac OS X only) to start the GWT hosted
mode browser and debug through Eclipse.</p>
</div>
<h2>Final Setup</h2>
<div class="sectionbody">
<p>Since you are creating a Gerrit instance for testing, you need to
also follow the other steps outlined under "Initialize the Schema"
in the Installation Guide.  Note that the database has already been
created if you launched Gerrit at least once.</p>
<p>Note that Bouncy Castle Crypto is automatically installed in the
classpath when debugging with hosted mode, so you will need to
create SSH keys with <tt>ssh-keygen</tt>.</p>
<ul>
<li>
<p>
<a href="install.html">Installation Guide</a>
</p>
</li>
<li>
<p>
<a href="project-setup.html">Project Setup</a>
</p>
</li>
</ul>
</div>
<hr style="
  height: 2px;
  color: silver;
  margin-top: 1.2em;
  margin-bottom: 0.5em;
">
<p>Part of <a href="index.html">Gerrit Code Review</a></p>
<div id="footer">
<div id="footer-text">
Version v2.0.24<br />
Last updated 02-Nov-2009 16:31:15 PDT
</div>
</div>
</body>
</html>
